package adt;

import java.util.ArrayList;
import java.util.Hashtable;

import runnable.Main;

/**
 * The representation of a character in Chinese.
 * 
 * 表示中文中的一个汉字。
 * 
 * @author Tianyu Xu
 * 
 */
public class Word {
	/**
	 * 从标签名到标签编号的映射
	 */
	private static Hashtable<String, Integer> tag2NumDict = null;
	/**
	 * 从标签编号到标签名的映射
	 */
	private static Hashtable<Integer, String> num2TagDict = null;

	static {
		tag2NumDict = new Hashtable<String, Integer>();
		num2TagDict = new Hashtable<Integer, String>();

		// add tag to number mappings
		// 添加标签到整数的映射
		tag2NumDict.put("B-NN-SHORT", 0);
		tag2NumDict.put("B-AD", 1);
		tag2NumDict.put("I-ON", 2);
		tag2NumDict.put("S-VV", 3);
		tag2NumDict.put("E-JJ", 4);
		tag2NumDict.put("S-NT-SHORT", 5);
		tag2NumDict.put("S-DT", 6);
		tag2NumDict.put("B-SB", 7);
		tag2NumDict.put("B-JJ", 8);
		tag2NumDict.put("I-VV", 9);
		tag2NumDict.put("S-VE", 10);
		tag2NumDict.put("S-VA", 11);
		tag2NumDict.put("S-VC", 12);
		tag2NumDict.put("I-FW", 13);
		tag2NumDict.put("E-VE", 14);
		tag2NumDict.put("I-NN", 15);
		tag2NumDict.put("E-VC", 16);
		tag2NumDict.put("E-VA", 17);
		tag2NumDict.put("E-CS", 18);
		tag2NumDict.put("I-NT", 19);
		tag2NumDict.put("I-NR", 20);
		tag2NumDict.put("S-NN", 21);
		tag2NumDict.put("S-NR", 22);
		tag2NumDict.put("B-IJ", 23);
		tag2NumDict.put("E-LC", 24);
		tag2NumDict.put("E-CD", 25);
		tag2NumDict.put("E-CC", 26);
		tag2NumDict.put("I-OD", 27);
		tag2NumDict.put("B-CC", 28);
		tag2NumDict.put("E-P", 29);
		tag2NumDict.put("S-CD", 30);
		tag2NumDict.put("B-CD", 31);
		tag2NumDict.put("S-CC", 32);
		tag2NumDict.put("E-M", 33);
		tag2NumDict.put("E-NN", 34);
		tag2NumDict.put("E-NT", 35);
		tag2NumDict.put("I-URL", 36);
		tag2NumDict.put("E-NR", 37);
		tag2NumDict.put("B-CS", 38);
		tag2NumDict.put("E-VV", 39);
		tag2NumDict.put("E-URL", 40);
		tag2NumDict.put("B-LC", 41);
		tag2NumDict.put("E-OD", 42);
		tag2NumDict.put("E-DEG", 43);
		tag2NumDict.put("I-VE", 44);
		tag2NumDict.put("B-SP", 45);
		tag2NumDict.put("I-DT", 46);
		tag2NumDict.put("E-ON", 47);
		tag2NumDict.put("I-VC", 48);
		tag2NumDict.put("E-IJ", 49);
		tag2NumDict.put("S-SP", 50);
		tag2NumDict.put("S-MSP", 51);
		tag2NumDict.put("B-DT", 52);
		tag2NumDict.put("S-SB", 53);
		tag2NumDict.put("S-CS", 54);
		tag2NumDict.put("B-MSP", 55);
		tag2NumDict.put("I-VA", 56);
		tag2NumDict.put("E-AD", 57);
		tag2NumDict.put("E-NN-SHORT", 58);
		tag2NumDict.put("S-LC", 59);
		tag2NumDict.put("S-LB", 60);
		tag2NumDict.put("E-ETC", 61);
		tag2NumDict.put("E-PU", 62);
		tag2NumDict.put("B-NN", 63);
		tag2NumDict.put("E-PN", 64);
		tag2NumDict.put("S-IJ", 65);
		tag2NumDict.put("I-CS", 66);
		tag2NumDict.put("I-M", 67);
		tag2NumDict.put("B-NR", 68);
		tag2NumDict.put("B-FW", 69);
		tag2NumDict.put("B-URL", 70);
		tag2NumDict.put("I-P", 71);
		tag2NumDict.put("B-NT", 72);
		tag2NumDict.put("E-FW", 73);
		tag2NumDict.put("I-LC", 74);
		tag2NumDict.put("I-CD", 75);
		tag2NumDict.put("I-CC", 76);
		tag2NumDict.put("I-NN-SHORT", 77);
		tag2NumDict.put("B-P", 78);
		tag2NumDict.put("S-JJ", 79);
		tag2NumDict.put("I-JJ", 80);
		tag2NumDict.put("B-M", 81);
		tag2NumDict.put("I-SP", 82);
		tag2NumDict.put("I-ETC", 83);
		tag2NumDict.put("S-ETC", 84);
		tag2NumDict.put("S-AS", 85);
		tag2NumDict.put("B-VE", 86);
		tag2NumDict.put("S-NT", 87);
		tag2NumDict.put("B-VC", 88);
		tag2NumDict.put("S-NR-SHORT", 89);
		tag2NumDict.put("B-VA", 90);
		tag2NumDict.put("S-OD", 91);
		tag2NumDict.put("I-IJ", 92);
		tag2NumDict.put("B-PN", 93);
		tag2NumDict.put("E-DT", 94);
		tag2NumDict.put("I-PU", 95);
		tag2NumDict.put("B-PU", 96);
		tag2NumDict.put("S-BA", 97);
		tag2NumDict.put("E-SB", 98);
		tag2NumDict.put("S-FW", 99);
		tag2NumDict.put("I-AD", 100);
		tag2NumDict.put("S-ON", 101);
		tag2NumDict.put("B-ETC", 102);
		tag2NumDict.put("I-PN", 103);
		tag2NumDict.put("S-DEG", 104);
		tag2NumDict.put("S-X", 105);
		tag2NumDict.put("S-DEC", 106);
		tag2NumDict.put("B-OD", 107);
		tag2NumDict.put("E-MSP", 108);
		tag2NumDict.put("S-P", 109);
		tag2NumDict.put("E-SP", 110);
		tag2NumDict.put("S-M", 111);
		tag2NumDict.put("B-ON", 112);
		tag2NumDict.put("B-DEG", 113);
		tag2NumDict.put("S-AD", 114);
		tag2NumDict.put("B-VV", 115);
		tag2NumDict.put("S-DEV", 116);
		tag2NumDict.put("S-PU", 117);
		tag2NumDict.put("S-DER", 118);
		tag2NumDict.put("S-PN", 119);

		tag2NumDict.put("E-SBJ", 120);
		tag2NumDict.put("S-TMP", 121);
		tag2NumDict.put("I-LOC", 122);
		tag2NumDict.put("I-TMP", 123);
		tag2NumDict.put("E-TMP", 124);
		tag2NumDict.put("B-PRD", 125);
		tag2NumDict.put("O", 126);
		tag2NumDict.put("B-OBJ", 127);
		tag2NumDict.put("I-OBJ", 128);
		tag2NumDict.put("B-SBJ", 129);
		tag2NumDict.put("B-LOC", 130);
		tag2NumDict.put("E-OBJ", 131);
		tag2NumDict.put("I-PRD", 132);
		tag2NumDict.put("S-PRD", 133);
		tag2NumDict.put("B-TMP", 134);
		tag2NumDict.put("E-PRD", 135);
		tag2NumDict.put("S-LOC", 136);
		tag2NumDict.put("I-SBJ", 137);
		tag2NumDict.put("S-OBJ", 138);
		tag2NumDict.put("S-SBJ", 139);
		tag2NumDict.put("E-LOC", 140);

		// add number to tag mappings
		// 添加整数到标签的映射
		num2TagDict.put(0, "B-NN-SHORT");
		num2TagDict.put(1, "B-AD");
		num2TagDict.put(2, "I-ON");
		num2TagDict.put(3, "S-VV");
		num2TagDict.put(4, "E-JJ");
		num2TagDict.put(5, "S-NT-SHORT");
		num2TagDict.put(6, "S-DT");
		num2TagDict.put(7, "B-SB");
		num2TagDict.put(8, "B-JJ");
		num2TagDict.put(9, "I-VV");
		num2TagDict.put(10, "S-VE");
		num2TagDict.put(11, "S-VA");
		num2TagDict.put(12, "S-VC");
		num2TagDict.put(13, "I-FW");
		num2TagDict.put(14, "E-VE");
		num2TagDict.put(15, "I-NN");
		num2TagDict.put(16, "E-VC");
		num2TagDict.put(17, "E-VA");
		num2TagDict.put(18, "E-CS");
		num2TagDict.put(19, "I-NT");
		num2TagDict.put(20, "I-NR");
		num2TagDict.put(21, "S-NN");
		num2TagDict.put(22, "S-NR");
		num2TagDict.put(23, "B-IJ");
		num2TagDict.put(24, "E-LC");
		num2TagDict.put(25, "E-CD");
		num2TagDict.put(26, "E-CC");
		num2TagDict.put(27, "I-OD");
		num2TagDict.put(28, "B-CC");
		num2TagDict.put(29, "E-P");
		num2TagDict.put(30, "S-CD");
		num2TagDict.put(31, "B-CD");
		num2TagDict.put(32, "S-CC");
		num2TagDict.put(33, "E-M");
		num2TagDict.put(34, "E-NN");
		num2TagDict.put(35, "E-NT");
		num2TagDict.put(36, "I-URL");
		num2TagDict.put(37, "E-NR");
		num2TagDict.put(38, "B-CS");
		num2TagDict.put(39, "E-VV");
		num2TagDict.put(40, "E-URL");
		num2TagDict.put(41, "B-LC");
		num2TagDict.put(42, "E-OD");
		num2TagDict.put(43, "E-DEG");
		num2TagDict.put(44, "I-VE");
		num2TagDict.put(45, "B-SP");
		num2TagDict.put(46, "I-DT");
		num2TagDict.put(47, "E-ON");
		num2TagDict.put(48, "I-VC");
		num2TagDict.put(49, "E-IJ");
		num2TagDict.put(50, "S-SP");
		num2TagDict.put(51, "S-MSP");
		num2TagDict.put(52, "B-DT");
		num2TagDict.put(53, "S-SB");
		num2TagDict.put(54, "S-CS");
		num2TagDict.put(55, "B-MSP");
		num2TagDict.put(56, "I-VA");
		num2TagDict.put(57, "E-AD");
		num2TagDict.put(58, "E-NN-SHORT");
		num2TagDict.put(59, "S-LC");
		num2TagDict.put(60, "S-LB");
		num2TagDict.put(61, "E-ETC");
		num2TagDict.put(62, "E-PU");
		num2TagDict.put(63, "B-NN");
		num2TagDict.put(64, "E-PN");
		num2TagDict.put(65, "S-IJ");
		num2TagDict.put(66, "I-CS");
		num2TagDict.put(67, "I-M");
		num2TagDict.put(68, "B-NR");
		num2TagDict.put(69, "B-FW");
		num2TagDict.put(70, "B-URL");
		num2TagDict.put(71, "I-P");
		num2TagDict.put(72, "B-NT");
		num2TagDict.put(73, "E-FW");
		num2TagDict.put(74, "I-LC");
		num2TagDict.put(75, "I-CD");
		num2TagDict.put(76, "I-CC");
		num2TagDict.put(77, "I-NN-SHORT");
		num2TagDict.put(78, "B-P");
		num2TagDict.put(79, "S-JJ");
		num2TagDict.put(80, "I-JJ");
		num2TagDict.put(81, "B-M");
		num2TagDict.put(82, "I-SP");
		num2TagDict.put(83, "I-ETC");
		num2TagDict.put(84, "S-ETC");
		num2TagDict.put(85, "S-AS");
		num2TagDict.put(86, "B-VE");
		num2TagDict.put(87, "S-NT");
		num2TagDict.put(88, "B-VC");
		num2TagDict.put(89, "S-NR-SHORT");
		num2TagDict.put(90, "B-VA");
		num2TagDict.put(91, "S-OD");
		num2TagDict.put(92, "I-IJ");
		num2TagDict.put(93, "B-PN");
		num2TagDict.put(94, "E-DT");
		num2TagDict.put(95, "I-PU");
		num2TagDict.put(96, "B-PU");
		num2TagDict.put(97, "S-BA");
		num2TagDict.put(98, "E-SB");
		num2TagDict.put(99, "S-FW");
		num2TagDict.put(100, "I-AD");
		num2TagDict.put(101, "S-ON");
		num2TagDict.put(102, "B-ETC");
		num2TagDict.put(103, "I-PN");
		num2TagDict.put(104, "S-DEG");
		num2TagDict.put(105, "S-X");
		num2TagDict.put(106, "S-DEC");
		num2TagDict.put(107, "B-OD");
		num2TagDict.put(108, "E-MSP");
		num2TagDict.put(109, "S-P");
		num2TagDict.put(110, "E-SP");
		num2TagDict.put(111, "S-M");
		num2TagDict.put(112, "B-ON");
		num2TagDict.put(113, "B-DEG");
		num2TagDict.put(114, "S-AD");
		num2TagDict.put(115, "B-VV");
		num2TagDict.put(116, "S-DEV");
		num2TagDict.put(117, "S-PU");
		num2TagDict.put(118, "S-DER");
		num2TagDict.put(119, "S-PN");

		num2TagDict.put(120, "E-SBJ");
		num2TagDict.put(121, "S-TMP");
		num2TagDict.put(122, "I-LOC");
		num2TagDict.put(123, "I-TMP");
		num2TagDict.put(124, "E-TMP");
		num2TagDict.put(125, "B-PRD");
		num2TagDict.put(126, "O");
		num2TagDict.put(127, "B-OBJ");
		num2TagDict.put(128, "I-OBJ");
		num2TagDict.put(129, "B-SBJ");
		num2TagDict.put(130, "B-LOC");
		num2TagDict.put(131, "E-OBJ");
		num2TagDict.put(132, "I-PRD");
		num2TagDict.put(133, "S-PRD");
		num2TagDict.put(134, "B-TMP");
		num2TagDict.put(135, "E-PRD");
		num2TagDict.put(136, "S-LOC");
		num2TagDict.put(137, "I-SBJ");
		num2TagDict.put(138, "S-OBJ");
		num2TagDict.put(139, "S-SBJ");
		num2TagDict.put(140, "E-LOC");
	}

	/**
	 * 从标签名转换至标签索引
	 * 
	 * @param tag
	 *            要转换的标签名
	 * @return 对应的标签索引
	 */
	public static int tag2Num(String tag) {
		return tag2NumDict.get(tag);
	}

	/**
	 * 从标签序号转换至标签名
	 * 
	 * @param num
	 *            要转换的标签序号
	 * @return 对应的标签名
	 */
	public static String num2Tag(int num) {
		return num2TagDict.get(num);
	}

	/**
	 * Filter the character.
	 * 
	 * 过滤字符的全半角、大小写、不同形式。
	 * 
	 * @param ch
	 *            要过滤的字符
	 * @return 过滤后的字符
	 */
	private static char filterChar(char ch) {
		if (ch == 'A' || ch == 'Ａ' || ch == 'a' || ch == 'ａ')
			return 'a';
		if (ch == 'B' || ch == 'Ｂ' || ch == 'b' || ch == 'ｂ')
			return 'b';
		if (ch == 'C' || ch == 'Ｃ' || ch == 'c' || ch == 'ｃ')
			return 'c';
		if (ch == 'D' || ch == 'Ｄ' || ch == 'd' || ch == 'ｄ')
			return 'd';
		if (ch == 'E' || ch == 'Ｅ' || ch == 'e' || ch == 'ｅ')
			return 'e';
		if (ch == 'F' || ch == 'Ｆ' || ch == 'f' || ch == 'ｆ')
			return 'f';
		if (ch == 'G' || ch == 'Ｇ' || ch == 'g' || ch == 'ｇ')
			return 'g';
		if (ch == 'H' || ch == 'Ｈ' || ch == 'h' || ch == 'ｈ')
			return 'h';
		if (ch == 'I' || ch == 'Ｉ' || ch == 'i' || ch == 'ｉ')
			return 'i';
		if (ch == 'J' || ch == 'Ｊ' || ch == 'j' || ch == 'ｊ')
			return 'j';
		if (ch == 'K' || ch == 'Ｋ' || ch == 'k' || ch == 'ｋ')
			return 'k';
		if (ch == 'L' || ch == 'Ｌ' || ch == 'l' || ch == 'ｌ')
			return 'l';
		if (ch == 'M' || ch == 'Ｍ' || ch == 'm' || ch == 'ｍ')
			return 'm';
		if (ch == 'N' || ch == 'Ｎ' || ch == 'n' || ch == 'ｎ')
			return 'n';
		if (ch == 'O' || ch == 'Ｏ' || ch == 'o' || ch == 'ｏ')
			return 'o';
		if (ch == 'P' || ch == 'Ｐ' || ch == 'p' || ch == 'ｐ')
			return 'p';
		if (ch == 'Q' || ch == 'Ｑ' || ch == 'q' || ch == 'ｑ')
			return 'q';
		if (ch == 'R' || ch == 'Ｒ' || ch == 'r' || ch == 'ｒ')
			return 'r';
		if (ch == 'S' || ch == 'Ｓ' || ch == 's' || ch == 'ｓ')
			return 's';
		if (ch == 'T' || ch == 'Ｔ' || ch == 't' || ch == 'ｔ')
			return 't';
		if (ch == 'U' || ch == 'Ｕ' || ch == 'u' || ch == 'ｕ')
			return 'u';
		if (ch == 'V' || ch == 'Ｖ' || ch == 'v' || ch == 'ｖ')
			return 'v';
		if (ch == 'W' || ch == 'Ｗ' || ch == 'w' || ch == 'ｗ')
			return 'w';
		if (ch == 'X' || ch == 'Ｘ' || ch == 'x' || ch == 'ｘ')
			return 'x';
		if (ch == 'Y' || ch == 'Ｙ' || ch == 'y' || ch == 'ｙ')
			return 'y';
		if (ch == 'Z' || ch == 'Ｚ' || ch == 'z' || ch == 'ｚ')
			return 'z';

		if (ch == '0' || ch == '０')
			return '0';
		if (ch == '1' || ch == '１')
			return '1';
		if (ch == '2' || ch == '２')
			return '2';
		if (ch == '3' || ch == '３')
			return '3';
		if (ch == '4' || ch == '４')
			return '4';
		if (ch == '5' || ch == '５')
			return '5';
		if (ch == '6' || ch == '６')
			return '6';
		if (ch == '7' || ch == '７')
			return '7';
		if (ch == '8' || ch == '８')
			return '8';
		if (ch == '9' || ch == '９')
			return '9';

		if (ch == '＂')
			return '\"';
		if (ch == '＇')
			return '\'';
		if (ch == '＊')
			return '*';
		if (ch == '＄')
			return '$';
		if (ch == '［')
			return '[';
		if (ch == '］')
			return ']';
		if (ch == '＾')
			return '^';
		if (ch == '～')
			return '~';
		if (ch == '｀')
			return '`';
		if (ch == '＿')
			return '_';
		if (ch == '	' || ch == ' ')
			return ' ';

		if (ch == '，' || ch == ',' || ch == '﹐')
			return '，'; // 逗号
		if (ch == '﹒' || ch == '.' || ch == '．')
			return '.'; // 句点
		if (ch == '、' || ch == '﹑')
			return '、'; // 顿号
		if (ch == '‘' || ch == '`')
			return '‘'; // 左单引
		if (ch == '’' || ch == '´')
			return '’'; // 右单引
		if (ch == '“' || ch == '〝')
			return '“'; // 左双引
		if (ch == '”' || ch == '〞')
			return '”'; // 左双引
		if (ch == '!' || ch == '﹗' || ch == '！')
			return '!'; // 感叹号
		if (ch == '？' || ch == '?' || ch == '﹖')
			return '？';
		if (ch == '：' || ch == ':' || ch == '︰' || ch == '﹕' || ch == '∶')
			return '：'; // 冒号
		if (ch == '；' || ch == ';' || ch == '﹔')
			return '；'; // 分号
		if (ch == '-' || ch == '－' || ch == '─' || ch == '﹣' || ch == '–' || ch == '―' || ch == '━' || ch == '—')
			return '-';
		if (ch == '（' || ch == '(' || ch == '﹙' || ch == '〔')
			return '（'; // 左小括号
		if (ch == '）' || ch == ')' || ch == '﹚' || ch == '〕')
			return '）'; // 右小括号
		if (ch == '{' || ch == '｛')
			return '{'; // 左大括号
		if (ch == '}' || ch == '｝')
			return '}'; // 右大括号
		if (ch == '<' || ch == '〈' || ch == '＜')
			return '<'; // 小于号
		if (ch == '>' || ch == '〉' || ch == '＞')
			return '>'; // 大于号
		if (ch == '|' || ch == '｜' || ch == '│')
			return '|'; // 竖杠
		if (ch == '/' || ch == '／' || ch == '∕')
			return '/'; // 右斜杠
		if (ch == '@' || ch == '＠')
			return '@'; // AT符号
		if (ch == '&' || ch == '＆')
			return '&'; // AND符号
		if (ch == '#' || ch == '＃')
			return '#'; // 井号
		if (ch == '%' || ch == '﹪' || ch == '％')
			return '%'; // 百分号
		if (ch == '¥' || ch == '￥')
			return '¥'; // 人民币符号
		if (ch == '+' || ch == '＋')
			return '+'; // 加号
		if (ch == '=' || ch == '＝')
			return '='; // 等号
		if (ch == '×' || ch == '╳')
			return '×'; // 乘号
		if (ch == '≥' || ch == '≧')
			return '≥'; // 大于等于号
		if (ch == '≤' || ch == '≦')
			return '≤'; // 小于等于号
		if (ch == 'Σ' || ch == '∑')
			return 'Σ'; // 连加号
		if (ch == '【' || ch == '〖')
			return '【'; // 左厚中括号
		if (ch == '】' || ch == '〗')
			return '】'; // 右厚中括号
		if (ch == '「' || ch == '『' || ch == '﹁' || ch == '﹃')
			return '「'; // 左古书引号
		if (ch == '」' || ch == '』' || ch == '﹂' || ch == '﹄')
			return '」'; // 右古书引号

		if (ch == '•' || ch == '●' || ch == '〇' || ch == '■' || ch == '◆' || ch == '◇' || ch == '▲' || ch == '△' || ch == '★' || ch == '☆' || ch == '®' || ch == '卍' || ch == '※')
			return '•'; // 特殊符号

		if (Main.wordDict.containsKey(ch))
			return ch;
		else {
			System.err.printf("#### Character not in the dict: %c\n", ch);
			return '□';
		}
	}

	/**
	 * 该 Word 对象对应的汉字字符
	 */
	private char ch;
	/**
	 * POS标签序号
	 */
	private int posTagNum;
	/**
	 * 指明该汉字是句中第几个谓词
	 */
	private ArrayList<Integer> predIndex;
	/**
	 * 一个字符可能有若干个SRL标签，存入列表中
	 */
	private ArrayList<Integer> srlTagList;
	/**
	 * 用于生成该字符信息的字符串
	 */
	private String str;

	/**
	 * 根据预定格式的字符串，生成对应的 Word 对象。
	 * 
	 * @param s
	 *            符合预定格式的字符串。首列为汉字字符，第二列为 POS-tag，第三列开始为语义标签（至少有一个）。每一列宽度为10个字符。
	 */
	public Word(String s) {
		srlTagList = new ArrayList<Integer>();
		predIndex = new ArrayList<Integer>();
		str = s;

		ch = filterChar(s.charAt(0));

		posTagNum = tag2Num(s.substring(10, 20).trim());

		// 将所有语义标签存入 Word 对象
		int i = 20;
		while (i < s.length()) {
			String srlTag = s.substring(i, i + 10).trim();
			int srlNum = tag2Num(srlTag);
			srlTagList.add(srlNum);
			// check whether the word is a part of a predicate
			// 判断该字是否属于一个谓词
			if ((srlNum == 125 || srlNum == 132 || srlNum == 133 || srlNum == 135))
				predIndex.add(srlTagList.size() - 1);
			i += 10;
		}
	}

	/**
	 * 获取字符的 POS 标签索引
	 * 
	 * @return 获取字符的 POS 标签索引
	 */
	public int getPosTagNum() {
		return posTagNum;
	}

	/**
	 * 获取 Word 对象对应的字符
	 * 
	 * @return Word 对象对应的字符
	 */
	public char getCh() {
		return ch;
	}

	@Override
	public String toString() {
		return str;
	}

	/**
	 * 获取字符对应的语义标签列表。语义标签长度即句中谓词个数。
	 * 
	 * @return 字符对应的语义标签列表
	 */
	public ArrayList<Integer> getSrlTagList() {
		return srlTagList;
	}

	/**
	 * 获取字符对应的谓词序号列表。该列表存储了该字符属于哪几个谓词。
	 * 
	 * @return 字符对应的谓词序号列表
	 */
	public ArrayList<Integer> getPredIndexList() {
		return predIndex;
	}
}
